package com.dux.commons.database.dao;

import java.lang.reflect.Modifier;

import com.dux.commons.scripts.java.classlistener.DefaultClassListener;
import com.dux.commons.utils.ClassUtils;


/**
 * 加载所有的DAO。DAO应该是公有的，不是抽象的，没有接口的，必须有默认的无参构造。
 * @author 杜祥
 * @create 2013-7-4
 */
public class DAOLoader extends DefaultClassListener
{

	@SuppressWarnings("unchecked")
	@Override
	public void postLoad(Class<?>[] classes)
	{
		for(Class<?> clazz : classes)
		{
			if(!isValidDAO(clazz))
				continue;
			try 
			{
				DAOManager.registerDAO((Class<? extends DAO>) clazz);
			} 
			catch (Exception e)
			{
				throw new Error("无法注册此DAO：" + clazz.getName(), e);
			} 
		}
		super.postLoad(classes);
	}

	@SuppressWarnings("unchecked")
	@Override
	public void preUnload(Class<?>[] classes)
	{
		super.preUnload(classes);
		for(Class<?> clazz : classes)
		{
			if(!isValidDAO(clazz))
				continue;
			
			try 
			{
				DAOManager.unregisterDAO((Class<? extends DAO>) clazz);
			}
			catch (Exception e) 
			{
				throw new Error("无法注销DAO：" + clazz.getName(), e);
			}
		}
	}
	
	
	/**
	 * 判断DAO是否有效
	 * @param clazz
	 * @return
	 */
	public boolean isValidDAO(Class<?> clazz)
	{
		if(!ClassUtils.isSubclass(clazz, DAO.class))
			return Boolean.FALSE;
		
		int modifier = clazz.getModifiers();
		
		if(Modifier.isAbstract(modifier) || Modifier.isInterface(modifier))
			return Boolean.FALSE;
		
		if(!Modifier.isPublic(modifier))
			return Boolean.FALSE;
		
		if(clazz.isAnnotationPresent(DisabledDAO.class))
			return Boolean.FALSE;
		
		return Boolean.TRUE;
	}
	
}
